package controller

import (
	"bluebell/logic"
	"bluebell/models"
	"bluebell/param"
	"bluebell/setting"
	"fmt"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	"path"
	"path/filepath"
)

func UploadImageHandler(c *gin.Context) {
	// 打印所有请求头，方便排查
	for k, v := range c.Request.Header {
		fmt.Printf("请求头: %s = %v\n", k, v)
	}

	// 打印请求 Content-Type
	fmt.Println("Content-Type:", c.ContentType())

	// 获取上传的文件
	file, err := c.FormFile("image")
	if err != nil {
		zap.L().Error("UploadImageHandler: 获取上传文件失败", zap.Error(err))
		ResponseError(c, models.CodeInvalidParam)
		return
	}
	zap.L().Info("UploadImageHandler: 成功获取上传文件", zap.String("文件名", file.Filename))

	// 获取当前用户ID
	userID, err := getCurrentUserID(c)
	if err != nil {
		zap.L().Error("UploadImageHandler: 获取用户ID失败", zap.Error(err))
		ResponseError(c, models.CodeNeedLogin)
		return
	}
	zap.L().Info("UploadImageHandler: 成功获取用户ID", zap.Int64("userID", userID))

	// 获取文件后缀名
	ext := filepath.Ext(file.Filename)
	zap.L().Info("UploadImageHandler: 获取文件后缀", zap.String("ext", ext))

	// 构造文件名为用户ID.ext
	fileName := fmt.Sprintf("%d%s", userID, ext)
	savePath := path.Join(setting.ImageDir, fileName)
	zap.L().Info("UploadImageHandler: 构造保存路径", zap.String("savePath", savePath))

	// 保存文件到本地
	if err := c.SaveUploadedFile(file, savePath); err != nil {
		zap.L().Error("UploadImageHandler: 保存文件失败", zap.Error(err))
		ResponseError(c, models.CodeServerBusy)
		return
	}
	zap.L().Info("UploadImageHandler: 成功保存文件")
	// 构造返回URL
	imageURL := fmt.Sprintf("%s%s/%s", setting.BaseURL, setting.ImageURLPath, fileName)

	// 新增：将头像URL存入数据库
	updateParam := &param.UpdateAvatarParam{
		UserID: userID,   // 从前面获取的当前用户ID
		Avatar: imageURL, // 完整的图片访问URL
	}

	logic.UpdateAvatar(updateParam)
	zap.L().Info("UploadImageHandler: 构造返回URL", zap.String("imageURL", imageURL))

	ResponseSuccess(c, gin.H{"url": imageURL})
}
